/// @NOTE: this file is included from Operations.hpp, IN cvMath:: namespace.

template<typename T> T wrapDegree( const T & angle )
{
	if( angle < 0.0 )
	{
		return 360.0 - ( fmod( abs( angle ), 360.0 ) );
	}
	return fmod( angle, 360.0 );
}

template<typename T> T wrapRadian( const T & angle )
{
	if( angle < 0.0 )
	{
		return FULLRAD - ( fmod( abs( angle ), FULLRAD ) );
	}
	return fmod( angle, FULLRAD );
}

template<typename T> T clamp(T value, const T &min, const T &max)
{
	if(value < min)	{ return min; }
	else if(value > max)	{ return max; }
	else	{ return value; }
}

// specialisation:
template<> RGBAf clamp(RGBAf value, const RGBAf &min, const RGBAf &max)
{
	value.r = clamp(value.r, min.r, max.r);
	value.g = clamp(value.g, min.g, max.g);
	value.b = clamp(value.b, min.b, max.b);
	value.a = clamp(value.a, min.a, max.a);
	return value;
}

template<> RGBAi clamp(RGBAi value, const RGBAi &min, const RGBAi &max)
{
	value.r = clamp(value.r, min.r, max.r);
	value.g = clamp(value.g, min.g, max.g);
	value.b = clamp(value.b, min.b, max.b);
	value.a = clamp(value.a, min.a, max.a);
	return value;
}
